cssimagefallback: Avoid allocating GPtrArray for colors
authorTimm Bäder <mail@baedert.org>
Wed, 23 Sep 2020 04:06:42 +0000 (06:06 +0200)
committerTimm Bäder <mail@baedert.org>
Thu, 24 Sep 2020 17:08:22 +0000 (19:08 +0200)
If we just parse a color, like image(#FFF), avoid allocating the
GPtrArray to store images. This happens in Adwaita for background images
of backdrop buttons. We save around 70 GPtrArrays this way.

gtk/gtkcssimagefallback.c

index c6549c6bd41409dd06b75ff3bad3dbc3c6208ba5..4d320a395da77308071ea29188d458e61f2e9c7f 100644 (file)
@@ -209,6 +209,9 @@ gtk_css_image_fallback_parse_arg (GtkCssParser *parser,
       if (image == NULL)
         return 0;
 
+      if (!data->images)
+        data->images = g_ptr_array_new_with_free_func (g_object_unref);
+
       g_ptr_array_add (data->images, image);
       return 1;
     }
@@ -235,18 +238,25 @@ gtk_css_image_fallback_parse (GtkCssImage  *image,
       return FALSE;
     }
 
-  data.images = g_ptr_array_new_with_free_func (g_object_unref);
-
   if (!gtk_css_parser_consume_function (parser, 1, G_MAXUINT, gtk_css_image_fallback_parse_arg, &data))
     {
       g_clear_pointer (&data.color, _gtk_css_value_unref);
-      g_ptr_array_free (data.images, TRUE);
+      if (data.images)
+        g_ptr_array_free (data.images, TRUE);
       return FALSE;
     }
 
   self->color = data.color;
-  self->n_images = data.images->len;
-  self->images = (GtkCssImage **) g_ptr_array_free (data.images, FALSE);
+  if (data.images)
+    {
+      self->n_images = data.images->len;
+      self->images = (GtkCssImage **) g_ptr_array_free (data.images, FALSE);
+    }
+  else
+    {
+      self->n_images = 0;
+      self->images = NULL;
+    }
 
   return TRUE;
 }